package com.yanxx.codegenerator.format.impl;

import com.yanxx.codegenerator.format.CodeFormatter;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 带日期前缀的编码格式化器
 * 支持使用当前日期作为前缀，并可自定义日期格式
 */
public class DatePrefixCodeFormatter implements CodeFormatter {
    
    private final String prefix;
    private final String dateFormat;
    private final int codeLength;
    private final char paddingChar;
    private final DateTimeFormatter dateFormatter;
    
    /**
     * 构造函数
     *
     * @param prefix      固定前缀（可选）
     * @param dateFormat  日期格式，如"yyyyMMdd"
     * @param codeLength  编号长度（不包括前缀和日期）
     * @param paddingChar 填充字符
     */
    public DatePrefixCodeFormatter(String prefix, String dateFormat, int codeLength, char paddingChar) {
        this.prefix = prefix != null ? prefix : "";
        this.dateFormat = dateFormat;
        this.codeLength = codeLength;
        this.paddingChar = paddingChar;
        this.dateFormatter = DateTimeFormatter.ofPattern(dateFormat);
    }
    
    /**
     * 使用默认填充字符'0'的构造函数
     *
     * @param prefix     固定前缀（可选）
     * @param dateFormat 日期格式，如"yyyyMMdd"
     * @param codeLength 编号长度（不包括前缀和日期）
     */
    public DatePrefixCodeFormatter(String prefix, String dateFormat, int codeLength) {
        this(prefix, dateFormat, codeLength, '0');
    }
    
    /**
     * 只使用日期格式的构造函数
     *
     * @param dateFormat 日期格式，如"yyyyMMdd"
     * @param codeLength 编号长度（不包括日期）
     */
    public DatePrefixCodeFormatter(String dateFormat, int codeLength) {
        this("", dateFormat, codeLength, '0');
    }
    
    @Override
    public String format(long value) {
        String currentDate = LocalDate.now().format(dateFormatter);
        String valueStr = String.valueOf(value);
        int paddingLength = codeLength - valueStr.length();
        
        StringBuilder sb = new StringBuilder();
        sb.append(prefix);
        sb.append(currentDate);
        
        // 补零
        for (int i = 0; i < paddingLength; i++) {
            sb.append(paddingChar);
        }
        
        sb.append(valueStr);
        return sb.toString();
    }
    
    @Override
    public String getDescription() {
        return String.format("DatePrefixCodeFormatter[prefix=%s, dateFormat=%s, length=%d, padding=%s]", 
                prefix, dateFormat, codeLength, paddingChar);
    }
}